{
 "cells": [
  {
   "attachments": {
    "agents_memory_light.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lab 2: Building a Travel Planner with a Simple LangGraph\n",
    "\n",
    "## Overview\n",
    "\n",
    "This lab guides you through the process of creating a simple Travel Planner using LangGraph, a library for building stateful, multi-step applications with language models. The Travel Planner demonstrates how to structure a conversational AI application that collects user input and generates personalized travel itineraries.\n",
    "\n",
    "#### What gets covered in this lab: \n",
    "we wil cover these aspects below:\n",
    "- LangGraph constructs for how to build Agentic systems with Graph\n",
    "- Introduction to short term and long term memory for 'turn-by-turn' conversations\n",
    "\n",
    "## Intro to Agents\n",
    "\n",
    "Agents are intelligent systems or components that utilize Large Language Models (LLMs) to perform tasks in a dynamic and autonomous manner. Here's a breakdown of the key concepts:\n",
    "\n",
    "### What Are Agents?\n",
    "1. Step-by-Step Thinking: Agents leverage LLMs to think and reason through problems in a structured way, often referred to as chain-of-thought reasoning. This allows them to plan, evaluate, and execute tasks effectively.\n",
    "2. Access to Tools: Agents can utilize external tools (e.g., calculators, databases, APIs) to enhance their decision-making and problem-solving capabilities.\n",
    "3. Access to Memory: Agents can store and retrieve context, enabling them to work on tasks over time, adapt to user interactions, and handle complex workflows.\n",
    "\n",
    "**Key characteristics of AI agents include:**\n",
    "\n",
    "**Perception:** The ability to gather information from their environment through sensors or data inputs.\n",
    "**Decision-making:** Using AI algorithms to process information and determine the best course of action.\n",
    "**Action:** The capability to execute decisions and interact with the environment or users.\n",
    "**Learning:** The ability to improve performance over time through experience and feedback.\n",
    "**Autonomy:** Operating independently to some degree, without constant human intervention.\n",
    "**Goal-oriented:** Working towards specific objectives or tasks.\n",
    "\n",
    "![agents_memory_light.png](attachment:agents_memory_light.png)\n",
    "\n",
    "## Use Case Details\n",
    "\n",
    "Our Travel Planner follows a straightforward, three-step process:\n",
    "\n",
    "1. **Initial User Input**: \n",
    "   - The application prompts the user to enter their desired travel plan to get assistance from AI Agent.\n",
    "   - This information is stored in the state.\n",
    "\n",
    "2. **Interests Input**:\n",
    "   - The user is asked to provide their interests for the trip.\n",
    "   - These interests are stored as a list in the state.\n",
    "\n",
    "3. **Itinerary Creation**:\n",
    "   - Using the collected city and interests, the application leverages a language model to generate a personalized day trip itinerary.\n",
    "   - The generated itinerary is presented to the user.\n",
    "\n",
    "The flow between these steps is managed by LangGraph, which handles the state transitions and ensures that each step is executed in the correct order."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Setup and Imports\n",
    "\n",
    "First, let's import the necessary modules and set up our environment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install -r requirements.txt --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:31:10.336523Z",
     "start_time": "2025-02-13T20:31:09.604991Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from typing import TypedDict, Annotated, List\n",
    "from langgraph.graph import StateGraph, END\n",
    "from langchain_core.messages import HumanMessage, AIMessage\n",
    "from langchain_core.runnables.graph import MermaidDrawMethod\n",
    "from IPython.display import display, Image"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LangGraph Basics\n",
    "\n",
    "### Key Components\n",
    "\n",
    "1. **StateGraph**\n",
    "   - This object will encapsulate the graph being traversed during excecution.\n",
    "   - The core of our application, defining the flow of our Travel Planner.\n",
    "   - PlannerState, a custom type representing the state of our planning process.\n",
    "\n",
    "2. **Nodes**\n",
    "    - In LangGraph, nodes are typically python functions.\n",
    "    - There are two main nodes we will use for our graph:\n",
    "        - The agent node: responsible for deciding what (if any) actions to take.\n",
    "        - The tool node: This node will orchestrate calling the respective tool and returning the output. \n",
    "4. **Edges**\n",
    "   - Defines how the logic is routed and how the graph decides to stop.\n",
    "   - Defines how your agents work and how different nodes communicate with each other.\n",
    "   - There are a few key types of edges:\n",
    "        - Normal Edges: Go directly from one node to the next.\n",
    "        - Conditional Edges: Call a function to determine which node(s) to go to next.\n",
    "        - Entry Point: Which node to call first when user input arrives.\n",
    "        - Conditional Entry Point: Call a function to determine which node(s) to call first when user input arrives.\n",
    "\n",
    "4. **LLM Integration**: Utilizing a language model to generate the final itinerary.\n",
    "5. **Memory Integration**: Utilizing long term and short term memory for conversations"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define Agent State\n",
    "\n",
    "We'll define the state that our agent will maintain throughout its operation. First, define the [State](https://langchain-ai.github.io/langgraph/concepts/low_level/#state) of the graph.  The State schema serves as the input schema for all Nodes and Edges in the graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:31:10.347410Z",
     "start_time": "2025-02-13T20:31:10.344288Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "class PlannerState(TypedDict):\n",
    "    messages: Annotated[List[HumanMessage | AIMessage], \"The messages in the conversation\"]\n",
    "    itinerary: str\n",
    "    city: str\n",
    "    user_message: str"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Set Up Language Model and Prompts\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:31:11.440373Z",
     "start_time": "2025-02-13T20:31:10.996096Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "from langchain_aws import ChatBedrockConverse\n",
    "import boto3\n",
    "from langgraph.checkpoint.memory import MemorySaver\n",
    "from langchain_core.runnables.config import RunnableConfig\n",
    "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n",
    "\n",
    "bedrock_client = boto3.client(\"bedrock-runtime\", region_name=\"us-west-2\")\n",
    "model_id = \"us.amazon.nova-lite-v1:0\"\n",
    "provider_id = \"amazon\"\n",
    "\n",
    "llm = ChatBedrockConverse(\n",
    "    model=model_id,\n",
    "    provider=provider_id,\n",
    "    temperature=0,\n",
    "    max_tokens=None,\n",
    "    client=bedrock_client,\n",
    ")\n",
    "\n",
    "itinerary_prompt = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"\"\"You are a helpful travel assistant. Create a day trip itinerary for {city} based on the user's interests. \n",
    "    Follow these instructions:\n",
    "    1. Use the below chat conversation and the latest input from Human to get the user interests.\n",
    "    2. Always account for travel time and meal times - if its not possible to do everything, then say so.\n",
    "    3. If the user hasn't stated a time of year or season, assume summer season in {city} and state this assumption in your response.\n",
    "    4. If the user hasn't stated a travel budget, assume a reasonable dollar amount and state this assumption in your response.\n",
    "    5. Provide a brief, bulleted itinerary in chronological order with specific hours of day.\"\"\"),\n",
    "    MessagesPlaceholder(\"chat_history\"),\n",
    "    (\"human\", \"{user_message}\"),\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define the nodes and Edges\n",
    "\n",
    "We are adding the nodes, edges as well as a persistant memory to the ```StateGraph``` before we compile it. \n",
    "- user travel plans\n",
    "- invoke with Bedrock\n",
    "- generate the travel plan for the day \n",
    "- ability to add or modify the plan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "def input_interests(state: PlannerState) -> PlannerState:\n",
    "    user_message = state['user_message'] #input(\"Your input: \")\n",
    "    #print(f\"We are going to :: {user_message}:: for trip to {state['city']} based on your interests mentioned in the prompt....\")\n",
    "\n",
    "    if not state.get('messages', None) : state['messages'] = []\n",
    "    return {\n",
    "        **state,\n",
    "    }\n",
    "\n",
    "def create_itinerary(state: PlannerState) -> PlannerState:\n",
    "    response = llm.invoke(itinerary_prompt.format_messages(city=state['city'], user_message=state['user_message'], chat_history=state['messages']))\n",
    "    print(\"\\nFinal Itinerary:\")\n",
    "    print(response.content)\n",
    "    return {\n",
    "        **state,\n",
    "        \"messages\": state['messages'] + [HumanMessage(content=state['user_message']), AIMessage(content=response.content)],\n",
    "        \"itinerary\": response.content\n",
    "    }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create and Compile the Graph\n",
    "\n",
    "Now we'll create our LangGraph workflow and compile it. \n",
    " \n",
    "- First, we initialize a StateGraph with the `State` class we defined above.\n",
    "- Then, we add our nodes and edges.\n",
    "- We use the [`START` Node, a special node](https://langchain-ai.github.io/langgraph/concepts/low_level/#start-node) that sends user input to the graph, to indicate where to start our graph.\n",
    "- The [`END` Node](https://langchain-ai.github.io/langgraph/concepts/low_level/#end-node) is a special node that represents a terminal node. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "workflow = StateGraph(PlannerState)\n",
    "workflow.add_node(\"input_interests\", input_interests)\n",
    "workflow.add_node(\"create_itinerary\", create_itinerary)\n",
    "workflow.set_entry_point(\"input_interests\")\n",
    "workflow.add_edge(\"input_interests\", \"create_itinerary\")\n",
    "workflow.add_edge(\"create_itinerary\", END)\n",
    "\n",
    "# The checkpointer lets the graph persist its state\n",
    "# this is a complete memory for the entire graph.\n",
    "memory = MemorySaver()\n",
    "app = workflow.compile(checkpointer=memory)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Display the graph structure\n",
    "\n",
    "Finally, we [compile our graph](https://langchain-ai.github.io/langgraph/concepts/low_level/#compiling-your-graph) to perform a few basic checks on the graph structure. We can visualize the graph as a [Mermaid diagram](https://github.com/mermaid-js/mermaid)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "display(\n",
    "    Image(\n",
    "        app.get_graph().draw_mermaid_png(\n",
    "            draw_method=MermaidDrawMethod.API,\n",
    "        )\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define the function that runs the graph\n",
    "\n",
    "When we compile the graph, we turn it into a LangChain Runnable, which automatically enables calling `.invoke()`, `.stream()` and `.batch()` with your inputs. In the following example, we run `stream()` to invoke the graph with inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "def run_travel_planner(user_request: str, config_dict: dict):\n",
    "    print(f\"Current User Request: {user_request}\\n\")\n",
    "    init_input = {\"user_message\": user_request,\"city\" : \"Seattle\"}\n",
    "\n",
    "    for output in app.stream(init_input, config=config_dict, stream_mode=\"values\"):\n",
    "        pass  # The nodes themselves now handle all printing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Travel Planner Example\n",
    "\n",
    "- To run this the system prompts and asks for user input for activities \n",
    "- We have initialized the graph state with city Seattle which usually will be dynamic and we will see in subsequrnt labs\n",
    "- You can enter like boating, swiming"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "config = {\"configurable\": {\"thread_id\": \"1\"}}\n",
    "\n",
    "user_request = \"Can you create a itinerary for a day trip in Seattle with boating and swimming options. Need a complete plan\"\n",
    "run_travel_planner(user_request, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Leverage the memory saver to manipulate the Graph State\n",
    "- Since the `Conversation Messages` are part of the graph state we can leverage that\n",
    "- However the graph state is tied to `session_id` which will be passed in as a `thread_id` which ties to a session\n",
    "- If we add a request with different thread id it will create a new session which will not have the previous `Interests`\n",
    "- However this this has the other check points variables as well and so this pattern is good for `A-Sync` workflow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "config = {\"configurable\": {\"thread_id\": \"1\"}}\n",
    "\n",
    "user_request = \"Can you add white water rafting to this itinerary\"\n",
    "run_travel_planner(user_request, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Run with another session\n",
    "\n",
    "Now this session will not have the previous conversations and we see it will create a new travel plan with the `white water rafting`  interests, not boating or swim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "config = {\"configurable\": {\"thread_id\": \"11\"}}\n",
    "\n",
    "user_request = \"Can you add white water rafting to itinerary\"\n",
    "run_travel_planner(user_request, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Memory\n",
    "\n",
    "Memory is key for any agentic conversation which is `Multi-Turn` or `Multi-Agent` colloboration conversation and more so if it spans multiple days. The 3 main aspects of Agents are:\n",
    "1. Tools\n",
    "2. Memory\n",
    "3. Planners\n",
    "\n",
    "\n",
    "### Explore `External Store` for memory\n",
    "\n",
    "\n",
    "There are 2 types of memory for AI Agents, short term and long term memory which can be explained below. \n",
    "Further reading can be at this [link](https://langchain-ai.github.io/langgraph/concepts/memory/#what-is-memory)\n",
    "\n",
    "Conversation memory can be explained by this diagram below which explains the `turn by turn` conversations which needs to be accessed by agents and then saved as a summary for long term memory\n",
    "\n",
    "<img src=\"./images/short-vs-long.png\" width=\"35%\"/>\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Create an external `Memory persistence`\n",
    "\n",
    "In this section we will leverage multi-thread, multi-session persistence to Chat Messages. Ideally you will leverage persistence like Redis Store etc to save messages per session\n",
    "\n",
    "##### Memory Management\n",
    "- We can have several Patterns - we can have each Agents with it's own Session memory\n",
    "- Or we can have the whole Graph have a combined memory in which case each agent will get it's own memory\n",
    "\n",
    "The MemorySaver or the Store have the concept of separating sections of memory by Namespaces or by Thread ID's and those can be leveraged to either 1/ Use the graph level message or memory 2/ Ecah agent can have it's own memory via space in saver or else having it's own saver like we do in the `ReACT agent`\n",
    "\n",
    "<img src=\"./images/multi_memory_light.png\" width=\"45%\" alt='multi_memory_light.png' /> \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:22.562181Z",
     "start_time": "2025-02-13T20:33:22.557800Z"
    }
   },
   "outputs": [],
   "source": [
    "from langgraph.store.base import BaseStore, Item, Op, Result\n",
    "from langgraph.store.memory import InMemoryStore\n",
    "from typing import Any, Iterable, Literal, NamedTuple, Optional, Union, cast\n",
    "\n",
    "class CustomMemoryStore(BaseStore):\n",
    "\n",
    "    def __init__(self, ext_store):\n",
    "        self.store = ext_store\n",
    "\n",
    "    def get(self, namespace: tuple[str, ...], key: str) -> Optional[Item]:\n",
    "        return self.store.get(namespace,key)\n",
    "\n",
    "    def put(self, namespace: tuple[str, ...], key: str, value: dict[str, Any]) -> None:\n",
    "        return self.store.put(namespace, key, value)\n",
    "    def batch(self, ops: Iterable[Op]) -> list[Result]:\n",
    "        return self.store.batch(ops)\n",
    "    async def abatch(self, ops: Iterable[Op]) -> list[Result]:\n",
    "        return self.store.abatch(ops)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Quick look at how to use this store"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:24.155352Z",
     "start_time": "2025-02-13T20:33:24.150701Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'data': ['list a']} ['list a']\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[('chat_messages', 'user_id_1')]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "in_memory_store = CustomMemoryStore(InMemoryStore())\n",
    "namespace_u = (\"chat_messages\", \"user_id_1\")\n",
    "key_u=\"user_id_1\"\n",
    "in_memory_store.put(namespace_u, key_u, {\"data\":[\"list a\"]})\n",
    "item_u = in_memory_store.get(namespace_u, key_u)\n",
    "print(item_u.value, item_u.value['data'])\n",
    "\n",
    "in_memory_store.list_namespaces()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Create the similiar graph as earlier -- note we will not have any mesages in the Graph state as that has been externalized"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:25.671517Z",
     "start_time": "2025-02-13T20:33:25.670032Z"
    }
   },
   "outputs": [],
   "source": [
    "class PlannerState(TypedDict):\n",
    "    itinerary: str\n",
    "    city: str\n",
    "    user_message: str"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:26.194806Z",
     "start_time": "2025-02-13T20:33:26.190643Z"
    }
   },
   "outputs": [],
   "source": [
    "def input_interests(state: PlannerState, config: RunnableConfig, *, store: BaseStore) -> PlannerState:\n",
    "    user_message = state['user_message'] #input(\"Your input: \")\n",
    "    return {\n",
    "        **state,\n",
    "    }\n",
    "\n",
    "def create_itinerary(state: PlannerState, config: RunnableConfig, *, store: BaseStore) -> PlannerState:\n",
    "    #- get the history from the store\n",
    "    user_u = f\"user_id_{config['configurable']['thread_id']}\"\n",
    "    namespace_u = (\"chat_messages\", user_u)\n",
    "    store_item = store.get(namespace=namespace_u, key=user_u)\n",
    "    chat_history_messages = store_item.value['data'] if store_item else []\n",
    "    print(user_u,chat_history_messages)\n",
    "\n",
    "    response = llm.invoke(itinerary_prompt.format_messages(city=state['city'], user_message=state['user_message'], chat_history=chat_history_messages))\n",
    "    print(\"\\nFinal Itinerary:\")\n",
    "    print(response.content)\n",
    "\n",
    "    #- add back to the store\n",
    "    store.put(namespace=namespace_u, key=user_u, value={\"data\":chat_history_messages+[HumanMessage(content=state['user_message']),AIMessage(content=response.content)]})\n",
    "    \n",
    "    return {\n",
    "        **state,\n",
    "        \"itinerary\": response.content\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:26.942211Z",
     "start_time": "2025-02-13T20:33:26.938684Z"
    }
   },
   "outputs": [],
   "source": [
    "in_memory_store_n = CustomMemoryStore(InMemoryStore())\n",
    "\n",
    "workflow = StateGraph(PlannerState)\n",
    "\n",
    "workflow.add_node(\"input_interests\", input_interests)\n",
    "workflow.add_node(\"create_itinerary\", create_itinerary)\n",
    "workflow.set_entry_point(\"input_interests\")\n",
    "workflow.add_edge(\"input_interests\", \"create_itinerary\")\n",
    "workflow.add_edge(\"create_itinerary\", END)\n",
    "\n",
    "\n",
    "app = workflow.compile(store=in_memory_store_n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:34.814976Z",
     "start_time": "2025-02-13T20:33:28.028582Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Current User Request: Can you create a itinerary for a day trip in california with boating and swimming options.  I need a complete plan that budgets for travel time and meal time.\n",
      "\n",
      "user_id_1 []\n",
      "\n",
      "Final Itinerary:\n",
      "Okay, got it. Let's plan a day trip itinerary for you in California with boating and swimming options.\n",
      "\n",
      "Since you didn't specify a particular city or region in California, I'll assume you're open to exploring different areas. For this itinerary, I'll focus on the San Diego area, as it offers great opportunities for boating and swimming.\n",
      "\n",
      "Assumptions:\n",
      "- Travel season: Summer (assuming this is your preference based on the activities)\n",
      "- Travel budget: Reasonable, around $100-150 per person for the day (not including accommodation)\n",
      "\n",
      "Proposed Itinerary:\n",
      "\n",
      "9:00 AM - Start your day at Mission Beach. Rent a paddleboard or kayak and spend an hour or two exploring the calm waters of the Pacific Ocean. (1-2 hours)\n",
      "\n",
      "11:30 AM - Head to La Jolla Cove, a picturesque coastal area known for its stunning cliffs and diverse marine life. Take a guided snorkeling tour to see the underwater world up close. (1.5-2 hours)\n",
      "\n",
      "1:30 PM - Break for lunch at one of the seafood restaurants in the La Jolla Village, such as The Taco Stand or Cove House. Enjoy the local cuisine and scenic views. (1-1.5 hours)\n",
      "\n",
      "3:00 PM - Visit the Coronado Beach, known for its wide, sandy shores and gentle waves. Spend some time swimming, building sandcastles, or simply relaxing on the beach. (1.5-2 hours)\n",
      "\n",
      "5:30 PM - End your day with a sunset cruise on the San Diego Bay. Admire the city skyline and enjoy the peaceful waters as the sun dips below the horizon. (1-1.5 hours)\n",
      "\n",
      "7:00 PM - Return to your starting point, with time to freshen up before dinner.\n",
      "\n",
      "Please note that this itinerary is designed to provide a well-rounded day trip experience in the San Diego area, focusing on boating and swimming activities. Travel times between locations and meal breaks have been accounted for. Let me know if you have any other specific requests or if you'd like me to modify the itinerary further.\n"
     ]
    }
   ],
   "source": [
    "def run_travel_planner(user_request: str, config_dict: dict):\n",
    "    print(f\"Current User Request: {user_request}\\n\")\n",
    "    init_input = {\"user_message\": user_request,\"city\" : \"Seattle\"}\n",
    "\n",
    "    for output in app.stream(init_input, config=config_dict, stream_mode=\"values\"):\n",
    "        pass  # The nodes themselves now handle all printing\n",
    "\n",
    "config = {\"configurable\": {\"thread_id\": \"1\"}}\n",
    "\n",
    "user_request = \"Can you create a itinerary for a day trip in california with boating and swimming options.  I need a complete plan that budgets for travel time and meal time.\"\n",
    "run_travel_planner(user_request, config)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:39.394455Z",
     "start_time": "2025-02-13T20:33:34.845217Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Current User Request: Can you add itinerary for white water rafting to this\n",
      "\n",
      "user_id_1 [HumanMessage(content='Can you create a itinerary for a day trip in california with boating and swimming options.  I need a complete plan that budgets for travel time and meal time.', additional_kwargs={}, response_metadata={}), AIMessage(content=\"Okay, got it. Let's plan a day trip itinerary for you in California with boating and swimming options.\\n\\nSince you didn't specify a particular city or region in California, I'll assume you're open to exploring different areas. For this itinerary, I'll focus on the San Diego area, as it offers great opportunities for boating and swimming.\\n\\nAssumptions:\\n- Travel season: Summer (assuming this is your preference based on the activities)\\n- Travel budget: Reasonable, around $100-150 per person for the day (not including accommodation)\\n\\nProposed Itinerary:\\n\\n9:00 AM - Start your day at Mission Beach. Rent a paddleboard or kayak and spend an hour or two exploring the calm waters of the Pacific Ocean. (1-2 hours)\\n\\n11:30 AM - Head to La Jolla Cove, a picturesque coastal area known for its stunning cliffs and diverse marine life. Take a guided snorkeling tour to see the underwater world up close. (1.5-2 hours)\\n\\n1:30 PM - Break for lunch at one of the seafood restaurants in the La Jolla Village, such as The Taco Stand or Cove House. Enjoy the local cuisine and scenic views. (1-1.5 hours)\\n\\n3:00 PM - Visit the Coronado Beach, known for its wide, sandy shores and gentle waves. Spend some time swimming, building sandcastles, or simply relaxing on the beach. (1.5-2 hours)\\n\\n5:30 PM - End your day with a sunset cruise on the San Diego Bay. Admire the city skyline and enjoy the peaceful waters as the sun dips below the horizon. (1-1.5 hours)\\n\\n7:00 PM - Return to your starting point, with time to freshen up before dinner.\\n\\nPlease note that this itinerary is designed to provide a well-rounded day trip experience in the San Diego area, focusing on boating and swimming activities. Travel times between locations and meal breaks have been accounted for. Let me know if you have any other specific requests or if you'd like me to modify the itinerary further.\", additional_kwargs={}, response_metadata={})]\n",
      "\n",
      "Final Itinerary:\n",
      "Okay, great! Let's add a white water rafting activity to the day trip itinerary in California.\n",
      "\n",
      "Revised Itinerary:\n",
      "\n",
      "9:00 AM - Start your day at Mission Beach. Rent a paddleboard or kayak and spend an hour or two exploring the calm waters of the Pacific Ocean. (1-2 hours)\n",
      "\n",
      "11:30 AM - Head to La Jolla Cove, a picturesque coastal area known for its stunning cliffs and diverse marine life. Take a guided snorkeling tour to see the underwater world up close. (1.5-2 hours)\n",
      "\n",
      "1:30 PM - Break for lunch at one of the seafood restaurants in the La Jolla Village, such as The Taco Stand or Cove House. Enjoy the local cuisine and scenic views. (1-1.5 hours)\n",
      "\n",
      "3:00 PM - Drive to the nearby San Diego River Gorge and join a white water rafting tour. Experience the thrill of navigating the rapids on a guided rafting adventure. (2-3 hours, including transportation)\n",
      "\n",
      "6:00 PM - After the rafting tour, visit the Coronado Beach, known for its wide, sandy shores and gentle waves. Spend some time swimming, building sandcastles, or simply relaxing on the beach. (1-1.5 hours)\n",
      "\n",
      "7:30 PM - End your day with a sunset cruise on the San Diego Bay. Admire the city skyline and enjoy the peaceful waters as the sun dips below the horizon. (1-1.5 hours)\n",
      "\n",
      "9:00 PM - Return to your starting point, with time to freshen up before dinner.\n",
      "\n",
      "Please note that the addition of the white water rafting activity has extended the overall duration of the day trip. I've accounted for the travel time to and from the rafting location, as well as the activity itself. Let me know if you have any other questions or if you'd like me to modify the itinerary further.\n"
     ]
    }
   ],
   "source": [
    "config = {\"configurable\": {\"thread_id\": \"1\"}}\n",
    "\n",
    "user_request = \"Can you add itinerary for white water rafting to this\"\n",
    "run_travel_planner(user_request, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Quick look at the store\n",
    "\n",
    "it will show the History of the Chat Messages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:39.414592Z",
     "start_time": "2025-02-13T20:33:39.411447Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('chat_messages', 'user_id_1')]\n",
      "{'data': [HumanMessage(content='Can you create a itinerary for a day trip in california with boating and swimming options.  I need a complete plan that budgets for travel time and meal time.', additional_kwargs={}, response_metadata={}), AIMessage(content=\"Okay, got it. Let's plan a day trip itinerary for you in California with boating and swimming options.\\n\\nSince you didn't specify a particular city or region in California, I'll assume you're open to exploring different areas. For this itinerary, I'll focus on the San Diego area, as it offers great opportunities for boating and swimming.\\n\\nAssumptions:\\n- Travel season: Summer (assuming this is your preference based on the activities)\\n- Travel budget: Reasonable, around $100-150 per person for the day (not including accommodation)\\n\\nProposed Itinerary:\\n\\n9:00 AM - Start your day at Mission Beach. Rent a paddleboard or kayak and spend an hour or two exploring the calm waters of the Pacific Ocean. (1-2 hours)\\n\\n11:30 AM - Head to La Jolla Cove, a picturesque coastal area known for its stunning cliffs and diverse marine life. Take a guided snorkeling tour to see the underwater world up close. (1.5-2 hours)\\n\\n1:30 PM - Break for lunch at one of the seafood restaurants in the La Jolla Village, such as The Taco Stand or Cove House. Enjoy the local cuisine and scenic views. (1-1.5 hours)\\n\\n3:00 PM - Visit the Coronado Beach, known for its wide, sandy shores and gentle waves. Spend some time swimming, building sandcastles, or simply relaxing on the beach. (1.5-2 hours)\\n\\n5:30 PM - End your day with a sunset cruise on the San Diego Bay. Admire the city skyline and enjoy the peaceful waters as the sun dips below the horizon. (1-1.5 hours)\\n\\n7:00 PM - Return to your starting point, with time to freshen up before dinner.\\n\\nPlease note that this itinerary is designed to provide a well-rounded day trip experience in the San Diego area, focusing on boating and swimming activities. Travel times between locations and meal breaks have been accounted for. Let me know if you have any other specific requests or if you'd like me to modify the itinerary further.\", additional_kwargs={}, response_metadata={}), HumanMessage(content='Can you add itinerary for white water rafting to this', additional_kwargs={}, response_metadata={}), AIMessage(content=\"Okay, great! Let's add a white water rafting activity to the day trip itinerary in California.\\n\\nRevised Itinerary:\\n\\n9:00 AM - Start your day at Mission Beach. Rent a paddleboard or kayak and spend an hour or two exploring the calm waters of the Pacific Ocean. (1-2 hours)\\n\\n11:30 AM - Head to La Jolla Cove, a picturesque coastal area known for its stunning cliffs and diverse marine life. Take a guided snorkeling tour to see the underwater world up close. (1.5-2 hours)\\n\\n1:30 PM - Break for lunch at one of the seafood restaurants in the La Jolla Village, such as The Taco Stand or Cove House. Enjoy the local cuisine and scenic views. (1-1.5 hours)\\n\\n3:00 PM - Drive to the nearby San Diego River Gorge and join a white water rafting tour. Experience the thrill of navigating the rapids on a guided rafting adventure. (2-3 hours, including transportation)\\n\\n6:00 PM - After the rafting tour, visit the Coronado Beach, known for its wide, sandy shores and gentle waves. Spend some time swimming, building sandcastles, or simply relaxing on the beach. (1-1.5 hours)\\n\\n7:30 PM - End your day with a sunset cruise on the San Diego Bay. Admire the city skyline and enjoy the peaceful waters as the sun dips below the horizon. (1-1.5 hours)\\n\\n9:00 PM - Return to your starting point, with time to freshen up before dinner.\\n\\nPlease note that the addition of the white water rafting activity has extended the overall duration of the day trip. I've accounted for the travel time to and from the rafting location, as well as the activity itself. Let me know if you have any other questions or if you'd like me to modify the itinerary further.\", additional_kwargs={}, response_metadata={})]}\n"
     ]
    }
   ],
   "source": [
    "print(in_memory_store_n.list_namespaces())\n",
    "print(in_memory_store_n.get(('chat_messages', 'user_id_1'),'user_id_1').value)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Finally we review the concept of having Each `Agent` be backed by it's own memory\n",
    "\n",
    "For this we will leverage the RunnableWithMessageHistory when creating the agent\n",
    "- Here we create to simulate a InMemoryChatMessageHistory, but this will be externalized in produftion use cases\n",
    "- use this this as a sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:39.439454Z",
     "start_time": "2025-02-13T20:33:39.434378Z"
    }
   },
   "outputs": [],
   "source": [
    "from langchain_core.chat_history import InMemoryChatMessageHistory\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain_core.runnables.history import RunnableWithMessageHistory\n",
    "\n",
    "\n",
    "bedrock_client = boto3.client(\"bedrock-runtime\", region_name=\"us-west-2\")\n",
    "model_id = \"us.amazon.nova-micro-v1:0\"\n",
    "\n",
    "provider_id = \"amazon\"\n",
    "\n",
    "chatbedrock_llm = ChatBedrockConverse(\n",
    "    model=model_id,\n",
    "    provider=provider_id,\n",
    "    temperature=0,\n",
    "    max_tokens=None,\n",
    "    client=bedrock_client,\n",
    ")\n",
    "\n",
    "\n",
    "itinerary_prompt = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"\"\"You are a helpful travel assistant. Create a day trip itinerary for {city} based on the user's interests. \n",
    "    Follow these instructions:\n",
    "    1. Use the below chat conversation and the latest input from Human to get the user interests.\n",
    "    2. Always account for travel time and meal times - if its not possible to do everything, then say so.\n",
    "    3. If the user hasn't stated a time of year or season, assume summer season in {city} and state this assumption in your response.\n",
    "    4. If the user hasn't stated a travel budget, assume a reasonable dollar amount and state this assumption in your response.\n",
    "    5. Provide a brief, bulleted itinerary in chronological order with specific hours of day.\"\"\"),\n",
    "    MessagesPlaceholder(\"chat_history\"),\n",
    "    (\"human\", \"{user_message}\"),\n",
    "])\n",
    "chain = itinerary_prompt | chatbedrock_llm \n",
    "\n",
    "\n",
    "history = InMemoryChatMessageHistory()\n",
    "def get_history():\n",
    "    return history\n",
    "\n",
    "wrapped_chain = RunnableWithMessageHistory(\n",
    "    chain,\n",
    "    get_history,\n",
    "    history_messages_key=\"chat_history\",\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:39.451925Z",
     "start_time": "2025-02-13T20:33:39.449808Z"
    }
   },
   "outputs": [],
   "source": [
    "class PlannerState(TypedDict):\n",
    "    itinerary: str\n",
    "    city: str\n",
    "    user_message: str\n",
    "\n",
    "def input_interests(state: PlannerState, config: RunnableConfig, *, store: BaseStore) -> PlannerState:\n",
    "    user_message = state['user_message'] #input(\"Your input: \")\n",
    "    return {\n",
    "        **state,\n",
    "    }\n",
    "\n",
    "def create_itinerary(state: PlannerState, config: RunnableConfig, *, store: BaseStore) -> PlannerState:\n",
    "    #- each agent manages it's memory\n",
    "    response = wrapped_chain.invoke({\"city\": state['city'], \"user_message\": state['user_message'], \"input\": state['user_message']} )\n",
    "    print(\"\\nFinal Itinerary:\")\n",
    "    print(response.content)\n",
    "    \n",
    "    return {\n",
    "        **state,\n",
    "        \"itinerary\": response.content\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:39.459828Z",
     "start_time": "2025-02-13T20:33:39.457411Z"
    }
   },
   "outputs": [],
   "source": [
    "workflow = StateGraph(PlannerState)\n",
    "\n",
    "#workflow.add_node(\"input_city\", input_city)\n",
    "workflow.add_node(\"input_interests\", input_interests)\n",
    "workflow.add_node(\"create_itinerary\", create_itinerary)\n",
    "\n",
    "workflow.set_entry_point(\"input_interests\")\n",
    "\n",
    "#workflow.add_edge(\"input_city\", \"input_interests\")\n",
    "workflow.add_edge(\"input_interests\", \"create_itinerary\")\n",
    "workflow.add_edge(\"create_itinerary\", END)\n",
    "\n",
    "\n",
    "app = workflow.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:45.265245Z",
     "start_time": "2025-02-13T20:33:41.095742Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Current User Request: Can you create a itinerary for boating, swim. Need a complete plan\n",
      "\n",
      "\n",
      "Final Itinerary:\n",
      "Sure, I'd be happy to create a day trip itinerary for you in Seattle focusing on boating and swimming. Based on our conversation, it seems you're interested in outdoor activities that involve water. Since you haven't specified a time of year or budget, I'll assume you're visiting in the summer season and have a reasonable budget of around $100 for the day.\n",
      "\n",
      "Here's a suggested itinerary for your day trip:\n",
      "\n",
      "**Day Trip Itinerary for Seattle - Boating and Swimming**\n",
      "\n",
      "**Assumptions:**\n",
      "- Visiting in the summer season\n",
      "- Budget of approximately $100 for the day\n",
      "\n",
      "**8:00 AM - Breakfast**\n",
      "- Start your day with a hearty breakfast at **The Pink Door Cafe** in Capitol Hill. Enjoy a coffee and a delicious breakfast sandwich. (Budget: $10)\n",
      "\n",
      "**9:30 AM - Head to Lake Union**\n",
      "- Travel to Lake Union, a short drive from downtown Seattle. \n",
      "\n",
      "**10:00 AM - Rent a Kayak or Canoe**\n",
      "- Head to **Lake Union Boat Company** to rent a kayak or canoe. They offer a variety of watercraft and safety gear. (Budget: $40 for a 4-hour rental)\n",
      "\n",
      "**12:00 PM - Paddle on Lake Union**\n",
      "- Spend 2 hours exploring the scenic Lake Union. Paddle to the Hiram M. Chittenden Locks and enjoy the views of the city skyline.\n",
      "\n",
      "**2:00 PM - Lunch**\n",
      "- Travel to **Gas Works Park** for a picnic lunch. Bring a packed lunch or enjoy something from the park's food trucks. (Budget: $15)\n",
      "\n",
      "**3:00 PM - Visit the Seattle Aquarium**\n",
      "- Head to the aquarium located at the base of the Space Needle. Spend an hour exploring marine life exhibits. (Budget: $30 for admission)\n",
      "\n",
      "**4:30 PM - Head to Alki Beach**\n",
      "- Travel to Alki Beach in West Seattle. It's a short drive from the aquarium.\n",
      "\n",
      "**5:00 PM - Swim at Alki Beach**\n",
      "- Spend some time swimming in the Puget Sound. The beach is a popular spot for swimming and sunbathing in the summer.\n",
      "\n",
      "**6:30 PM - Dinner**\n",
      "- Enjoy dinner at **The Crab Pot** in West Seattle, known for its fresh seafood. (Budget: $35)\n",
      "\n",
      "**8:00 PM - Return Boat Rental**\n",
      "- Return the kayak or canoe to Lake Union Boat Company.\n",
      "\n",
      "**8:30 PM - Wrap Up**\n",
      "- Head back to your starting point, reflecting on a fun day of boating and swimming in Seattle.\n",
      "\n",
      "**Notes:**\n",
      "- Ensure to check the weather forecast closer to the date and adjust plans accordingly.\n",
      "- If you find that the budget is being exceeded, consider opting for a less expensive dining option or reducing the rental time for the kayak/canoe.\n",
      "\n",
      "Enjoy your day trip!\n"
     ]
    }
   ],
   "source": [
    "def run_travel_planner(user_request: str, config_dict: dict):\n",
    "    print(f\"Current User Request: {user_request}\\n\")\n",
    "    init_input = {\"user_message\": user_request,\"city\" : \"Seattle\"}\n",
    "\n",
    "    for output in app.stream(init_input, config=config_dict, stream_mode=\"values\"):\n",
    "        pass  # The nodes themselves now handle all printing\n",
    "\n",
    "config = {\"configurable\": {\"thread_id\": \"1\"}}\n",
    "\n",
    "user_request = \"Can you create a itinerary for boating, swim. Need a complete plan\"\n",
    "run_travel_planner(user_request, config)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-13T20:33:49.599857Z",
     "start_time": "2025-02-13T20:33:45.286685Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Current User Request: Can you add white water rafting to this itinerary\n",
      "\n",
      "\n",
      "Final Itinerary:\n",
      "Adding white water rafting to your itinerary is an exciting idea! However, it's important to note that white water rafting typically requires a bit more planning and preparation, and it's usually done in areas with more rapids, which might not be directly accessible from Seattle. For this itinerary, I'll assume you're willing to make a bit of a detour to a suitable location for white water rafting.\n",
      "\n",
      "Here's the revised itinerary with white water rafting included:\n",
      "\n",
      "**Day Trip Itinerary for Seattle - Boating, Swimming, and White Water Rafting**\n",
      "\n",
      "**Assumptions:**\n",
      "- Visiting in the summer season\n",
      "- Budget of approximately $100 for the day\n",
      "\n",
      "**8:00 AM - Breakfast**\n",
      "- Start your day with a hearty breakfast at **The Pink Door Cafe** in Capitol Hill. Enjoy a coffee and a breakfast sandwich. (Budget: $10)\n",
      "\n",
      "**9:30 AM - Head to Lake Union**\n",
      "- Travel to Lake Union, a short drive from downtown Seattle.\n",
      "\n",
      "**10:00 AM - Rent a Kayak or Canoe**\n",
      "- Head to **Lake Union Boat Company** to rent a kayak or canoe. They offer a variety of watercraft and safety gear. (Budget: $40 for a 4-hour rental)\n",
      "\n",
      "**12:00 PM - Paddle on Lake Union**\n",
      "- Spend 2 hours exploring the scenic Lake Union. Paddle to the Hiram M. Chittenden Locks and enjoy the views of the city skyline.\n",
      "\n",
      "**2:00 PM - Lunch**\n",
      "- Travel to **Gas Works Park** for a picnic lunch. Bring a packed lunch or enjoy something from the park's food trucks. (Budget: $15)\n",
      "\n",
      "**3:00 PM - Visit the Seattle Aquarium**\n",
      "- Head to the aquarium located at the base of the Space Needle. Spend an hour exploring marine life exhibits. (Budget: $30 for admission)\n",
      "\n",
      "**4:30 PM - Travel to White River for Rafting**\n",
      "- Depart for the White River, which is about a 1.5-hour drive from Seattle. This is a popular spot for white water rafting.\n",
      "\n",
      "**6:30 PM - White Water Rafting**\n",
      "- Spend 2 hours white water rafting on the White River. Book a rafting tour in advance. (Budget: $50 for a 2-hour rafting tour)\n",
      "\n",
      "**8:30 PM - Dinner**\n",
      "- Enjoy dinner at a local restaurant in the White River area. (Budget: $25)\n",
      "\n",
      "**10:30 PM - Return to Seattle**\n",
      "- Head back to Seattle, considering the travel time.\n",
      "\n",
      "**Notes:**\n",
      "- Ensure to check the weather forecast closer to the date and adjust plans accordingly.\n",
      "- It's important to book the rafting tour in advance as these tours can fill up quickly, especially during the summer.\n",
      "- If the budget is being exceeded, consider opting for a less expensive dining option or reducing the rental time for the kayak/canoe.\n",
      "\n",
      "Enjoy your adventurous day trip!\n"
     ]
    }
   ],
   "source": [
    "user_request = \"Can you add white water rafting to this itinerary\"\n",
    "run_travel_planner(user_request, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusion\n",
    "\n",
    "You have successfully executed a simple LangGraph implementation, this lab demonstrates how LangGraph can be used to create a simple yet effective Travel Planner. By structuring our application as a graph of interconnected nodes, we achieve a clear separation of concerns and a easily modifiable workflow. This approach can be extended to more complex applications, showcasing the power and flexibility of graph-based designs in AI-driven conversational interfaces.\n",
    "\n",
    "Please proceed to the next lab"
   ]
  }
 ],
 "metadata": {
  "availableInstances": [
   {
    "_defaultOrder": 0,
    "_isFastLaunch": true,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 4,
    "name": "ml.t3.medium",
    "vcpuNum": 2
   },
   {
    "_defaultOrder": 1,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 8,
    "name": "ml.t3.large",
    "vcpuNum": 2
   },
   {
    "_defaultOrder": 2,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.t3.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 3,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.t3.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 4,
    "_isFastLaunch": true,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 8,
    "name": "ml.m5.large",
    "vcpuNum": 2
   },
   {
    "_defaultOrder": 5,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.m5.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 6,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.m5.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 7,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 64,
    "name": "ml.m5.4xlarge",
    "vcpuNum": 16
   },
   {
    "_defaultOrder": 8,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 128,
    "name": "ml.m5.8xlarge",
    "vcpuNum": 32
   },
   {
    "_defaultOrder": 9,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 192,
    "name": "ml.m5.12xlarge",
    "vcpuNum": 48
   },
   {
    "_defaultOrder": 10,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 256,
    "name": "ml.m5.16xlarge",
    "vcpuNum": 64
   },
   {
    "_defaultOrder": 11,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 384,
    "name": "ml.m5.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 12,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 8,
    "name": "ml.m5d.large",
    "vcpuNum": 2
   },
   {
    "_defaultOrder": 13,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.m5d.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 14,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.m5d.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 15,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 64,
    "name": "ml.m5d.4xlarge",
    "vcpuNum": 16
   },
   {
    "_defaultOrder": 16,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 128,
    "name": "ml.m5d.8xlarge",
    "vcpuNum": 32
   },
   {
    "_defaultOrder": 17,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 192,
    "name": "ml.m5d.12xlarge",
    "vcpuNum": 48
   },
   {
    "_defaultOrder": 18,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 256,
    "name": "ml.m5d.16xlarge",
    "vcpuNum": 64
   },
   {
    "_defaultOrder": 19,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 384,
    "name": "ml.m5d.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 20,
    "_isFastLaunch": false,
    "category": "General purpose",
    "gpuNum": 0,
    "hideHardwareSpecs": true,
    "memoryGiB": 0,
    "name": "ml.geospatial.interactive",
    "supportedImageNames": [
     "sagemaker-geospatial-v1-0"
    ],
    "vcpuNum": 0
   },
   {
    "_defaultOrder": 21,
    "_isFastLaunch": true,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 4,
    "name": "ml.c5.large",
    "vcpuNum": 2
   },
   {
    "_defaultOrder": 22,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 8,
    "name": "ml.c5.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 23,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.c5.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 24,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.c5.4xlarge",
    "vcpuNum": 16
   },
   {
    "_defaultOrder": 25,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 72,
    "name": "ml.c5.9xlarge",
    "vcpuNum": 36
   },
   {
    "_defaultOrder": 26,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 96,
    "name": "ml.c5.12xlarge",
    "vcpuNum": 48
   },
   {
    "_defaultOrder": 27,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 144,
    "name": "ml.c5.18xlarge",
    "vcpuNum": 72
   },
   {
    "_defaultOrder": 28,
    "_isFastLaunch": false,
    "category": "Compute optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 192,
    "name": "ml.c5.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 29,
    "_isFastLaunch": true,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.g4dn.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 30,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.g4dn.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 31,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 64,
    "name": "ml.g4dn.4xlarge",
    "vcpuNum": 16
   },
   {
    "_defaultOrder": 32,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 128,
    "name": "ml.g4dn.8xlarge",
    "vcpuNum": 32
   },
   {
    "_defaultOrder": 33,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 4,
    "hideHardwareSpecs": false,
    "memoryGiB": 192,
    "name": "ml.g4dn.12xlarge",
    "vcpuNum": 48
   },
   {
    "_defaultOrder": 34,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 256,
    "name": "ml.g4dn.16xlarge",
    "vcpuNum": 64
   },
   {
    "_defaultOrder": 35,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 61,
    "name": "ml.p3.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 36,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 4,
    "hideHardwareSpecs": false,
    "memoryGiB": 244,
    "name": "ml.p3.8xlarge",
    "vcpuNum": 32
   },
   {
    "_defaultOrder": 37,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 8,
    "hideHardwareSpecs": false,
    "memoryGiB": 488,
    "name": "ml.p3.16xlarge",
    "vcpuNum": 64
   },
   {
    "_defaultOrder": 38,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 8,
    "hideHardwareSpecs": false,
    "memoryGiB": 768,
    "name": "ml.p3dn.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 39,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.r5.large",
    "vcpuNum": 2
   },
   {
    "_defaultOrder": 40,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.r5.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 41,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 64,
    "name": "ml.r5.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 42,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 128,
    "name": "ml.r5.4xlarge",
    "vcpuNum": 16
   },
   {
    "_defaultOrder": 43,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 256,
    "name": "ml.r5.8xlarge",
    "vcpuNum": 32
   },
   {
    "_defaultOrder": 44,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 384,
    "name": "ml.r5.12xlarge",
    "vcpuNum": 48
   },
   {
    "_defaultOrder": 45,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 512,
    "name": "ml.r5.16xlarge",
    "vcpuNum": 64
   },
   {
    "_defaultOrder": 46,
    "_isFastLaunch": false,
    "category": "Memory Optimized",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 768,
    "name": "ml.r5.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 47,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 16,
    "name": "ml.g5.xlarge",
    "vcpuNum": 4
   },
   {
    "_defaultOrder": 48,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.g5.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 49,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 64,
    "name": "ml.g5.4xlarge",
    "vcpuNum": 16
   },
   {
    "_defaultOrder": 50,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 128,
    "name": "ml.g5.8xlarge",
    "vcpuNum": 32
   },
   {
    "_defaultOrder": 51,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 1,
    "hideHardwareSpecs": false,
    "memoryGiB": 256,
    "name": "ml.g5.16xlarge",
    "vcpuNum": 64
   },
   {
    "_defaultOrder": 52,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 4,
    "hideHardwareSpecs": false,
    "memoryGiB": 192,
    "name": "ml.g5.12xlarge",
    "vcpuNum": 48
   },
   {
    "_defaultOrder": 53,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 4,
    "hideHardwareSpecs": false,
    "memoryGiB": 384,
    "name": "ml.g5.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 54,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 8,
    "hideHardwareSpecs": false,
    "memoryGiB": 768,
    "name": "ml.g5.48xlarge",
    "vcpuNum": 192
   },
   {
    "_defaultOrder": 55,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 8,
    "hideHardwareSpecs": false,
    "memoryGiB": 1152,
    "name": "ml.p4d.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 56,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 8,
    "hideHardwareSpecs": false,
    "memoryGiB": 1152,
    "name": "ml.p4de.24xlarge",
    "vcpuNum": 96
   },
   {
    "_defaultOrder": 57,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 32,
    "name": "ml.trn1.2xlarge",
    "vcpuNum": 8
   },
   {
    "_defaultOrder": 58,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 512,
    "name": "ml.trn1.32xlarge",
    "vcpuNum": 128
   },
   {
    "_defaultOrder": 59,
    "_isFastLaunch": false,
    "category": "Accelerated computing",
    "gpuNum": 0,
    "hideHardwareSpecs": false,
    "memoryGiB": 512,
    "name": "ml.trn1n.32xlarge",
    "vcpuNum": 128
   }
  ],
  "instance_type": "ml.t3.medium",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
